# 单词搜索计数

# 题目内容

给定一个 $m \times n$ 的二维字符网格 board 和一个字符串单词 word

请计算单词 word 在网格中出现的总次数。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个搜索路径中不允许被重复使用。

# 输入描述

  • board:二维字符列表,每个元素为大写英文字母,$1 \le m,n \le 10$。
  • word:字符串,由大写英文字母组成,$1 \le len(word) \le 100$。

# 输出描述

返回一个整数,表示单词在网格中出现的路径总数。

# 样例

# 样例 1

输入

ABCE SFCS ADEE
ABCCED
1
2

输出

1
1

# 代码

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

rl.on('line', (input) => {
    const bord = input.split(' ').map(v => v.split(''));
    rl.on('line', (word) => {
        const m = bord.length;
        const n = bord[0].length;
        let num = 0;
        const used = Array.from({length: m}, () => Array.from({length: n}, () => false));
        const temp = [[-1,0], [1,0], [0,-1], [0,1]];
        const dfs = (x, y, s) => {
            if (s === word) {
                num++;
                return;
            } else if (s.length > word.length) {
                return;
            }
            for(let i=0; i<temp.length; i++) {
                const nx = x + temp[i][0];
                const ny = y + temp[i][1];
                if (nx >=0 && nx < m && ny >=0 && ny < n && !used[nx][ny]) {
                    used[nx][ny] = true;
                    dfs(nx, ny, s+bord[nx][ny]);
                    used[nx][ny] = false;
                }
            }
        }
        for(let i=0; i<m; i++) {
            for(let j=0; j<n; j++) {
                if (bord[i][j] === word[0]) {
                    used[i][j] = true;
                    dfs(i, j, word[0]);
                    used[i][j] = false;
                }
            }
        }
        console.log(num);
    });
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43